//
// Created by jiangpenghui on 2023/4/12.
//

#ifndef CMAKECXX_X_TEMPLATE_H
#define CMAKECXX_X_TEMPLATE_H

template<class T>
class X_template {
    //泛型编程（类型名） class 代名词
    // typename 声明的成员T::id是类型, i 是成员名称
    typename T::id i;
public:
    void f() { i.g(); }
};

// 等同于上面X_template 结构
class Y {
public:
    class id {
    public:
        void g() {};
    };
};

#include <iostream>
#include <list>
#include <memory>
#include <vector>
#include <string>
#include <cstddef>
#include <bitset>


using namespace std;

// 默认的allocator参数  模板函数    vector<int> 参数
template<class T, template<class U, class  = allocator<U>> class Seq>
void printSeq(Seq<T> &seq) {
    for (typename Seq<T>::iterator b = seq.begin(); b != seq.end();) {
        cout << *b++ << endl;
    }
}

// 泛元CharT 参数 N
template<class charT, size_t N>
basic_string<charT> bitsetToString(const bitset<N> &bs) {
    // bs.template(声明使用模板） to_string方法签名，定义泛元 charT
    return bs.template to_string<charT, char_traits<charT>, allocator<charT>>();
}


// 成员模板
template<typename T>
class complex {
public:
    // 模板构造函数
    template<class X>
    complex(const complex<X> &);
};

//声明 complex<float>z(1,2)  complex<double>w(z)
template<typename T>
template<class X>
complex<T>::complex(const complex<X> &) {
    cout << "construction ： complex" << endl;
}

#endif //CMAKECXX_X_TEMPLATE_H
